package jmail;

//SendMail.java
import java.util.Properties;
import java.util.Queue;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import jmail.window.JMainFrame;

public class SendMail implements Runnable {

    private String host;
    private String from;
    private String to;
    private String user;
    private String ps;
    private Properties props;
    private Session session;
    private JMainFrame.MessageCallBack mcb;
    private Queue mailque;
    private Vector mail;

    public SendMail(String smtphost,String customMailBoxAddress, String username, String password, JMainFrame.MessageCallBack mc, Queue mails) {
        host = smtphost;
        //发送方邮箱地址（如BlogJava2006@blog.com.cn.）
        from = customMailBoxAddress;
        //收件人邮箱地址
        //发送者的邮箱用户名
        user = username;
        //发送者的邮箱密码
        ps = password;
        mcb = mc;
        mailque = mails;
        props = new Properties();

        //设置发送邮件的邮件服务器的属性（这里使用新浪的smtp服务器）
        props.put("mail.smtp.host", host);
        //需要经过授权，也就是有户名和密码的校验，这样才能通过验证（一定要有//这一条）
        props.put("mail.smtp.auth", "true");

        //用刚刚设置好的props对象构建一个session
        session = Session.getDefaultInstance(props);
    }

    private void sendWithAttach(String customMailBoxAddress, String username, String password, String serverMailBoxAddress, String subject, String attachmentPath, String attachmentName) {

        //有了这句便可以在发送邮件的过程中在console处显示过程信息，供调试使
        //用（有的时候网络连通性不够好，发送邮件可能会有延迟，在这里面会有所//提示，所以最好是加上这句，避免盲目的等待）
        session.setDebug(true);

        //定义消息对象
        MimeMessage message = new MimeMessage(session);
        try {
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);

            // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
            Multipart multipart = new MimeMultipart();
            //设置邮件的文本内容
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setText("邮件的具体内容在此");
            multipart.addBodyPart(contentPart);
            //添加附件
            BodyPart attachmentPart = new MimeBodyPart();
            if (!"".equals(attachmentPath)) {
                DataSource source = new FileDataSource(attachmentPath);
                attachmentPart.setDataHandler(new DataHandler(source));
                //注意：下面定义的enc对象用来处理中文附件名，否则名称是中文的附//件在邮箱里面显示的会是乱码，
                //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
                //attachmentPart.setFileName("=?GBK?B?" + enc.encode(attachmentName.getBytes()) + "?=");
                attachmentPart.setFileName(attachmentName);
                multipart.addBodyPart(attachmentPart);
            }
            //将multipart对象放到message中
            message.setContent(multipart);
            //发送邮件
            message.saveChanges();
            Transport transport = session.getTransport("smtp");
            transport.connect(host, username, password);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sendNoAttach() {

        //有了这句便可以在发送邮件的过程中在console处显示过程信息，供调试使
        //用（有的时候网络连通性不够好，发送邮件可能会有延迟，在这里面会有所//提示，所以最好是加上这句，避免盲目的等待）
        session.setDebug(false);
        try {
            Transport transport = session.getTransport("smtp");
            transport.connect(host, user, ps);
            while (mailque.size() != 0 || !mcb.getStopSend()) {
                if(mailque.size() != 0){
                mail = (Vector) mailque.poll();
                //定义消息对象
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(from));
                to = (String) mail.get(0);
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                message.setSubject((String) mail.get(2));
                // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
                Multipart multipart = new MimeMultipart();
                //设置邮件的文本内容
                BodyPart contentPart = new MimeBodyPart();
                contentPart.setText((String) mail.get(1));
                multipart.addBodyPart(contentPart);
                //添加附件 sendNoAttach function don't need this segment
//            BodyPart attachmentPart = new MimeBodyPart();
//            if(!"".equals(attachmentPath)){
//            DataSource source = new FileDataSource(attachmentPath);
//            attachmentPart.setDataHandler(new DataHandler(source));
//            //注意：下面定义的enc对象用来处理中文附件名，否则名称是中文的附//件在邮箱里面显示的会是乱码，
//            //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//            //attachmentPart.setFileName("=?GBK?B?" + enc.encode(attachmentName.getBytes()) + "?=");
//            attachmentPart.setFileName(attachmentName);
//            multipart.addBodyPart(attachmentPart);
//            }
                //将multipart对象放到message中
                message.setContent(multipart);
                //发送邮件
                message.saveChanges();
                InternetAddress[] add =(InternetAddress[]) message.getAllRecipients();
                message.setReplyTo(add);
                /* enable this function below will send mail to *
                transport.sendMessage(message, add);
                */
                mcb.updateMailStatu((Integer) mail.get(3), 6, true);
                }
                Thread.sleep(3000);
            }
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            System.out.println("回复完成");
        }
    }

    @Override
    public void run() {
        sendNoAttach();
    }
}
